package org.openea.eap.module.obpm.service.form.generator;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.jsoup.nodes.Element;
import org.openbpm.base.api.exception.BusinessException;
import org.openbpm.base.core.util.StringUtil;
import org.openbpm.base.core.util.ThreadMapUtil;
import org.openbpm.bus.api.constant.BusColumnCtrlType;
import org.openbpm.bus.api.constant.BusTableRelType;
import org.openbpm.bus.api.model.IBusTableRel;
import org.openbpm.bus.api.model.IBusinessColumn;
import org.springframework.stereotype.Component;


@Component
public class MobileFormElementGenerator
        extends AbsFormElementGenerator {
    public String getColumn(IBusinessColumn column, IBusTableRel relation) {
        // TODO
        if ("1".equals("1")) {
            return super.getColumn(column, relation);
        }

        BusColumnCtrlType columnType = BusColumnCtrlType.getByKey(column.getCtrl().getType());
        String boCode = relation.getBusObj().getKey();
        ThreadMapUtil.put("boCode", boCode);
        ThreadMapUtil.put("relation", relation);

        return getColumnOnetext(column);
    }


    private void handleVModel(Element element, IBusinessColumn column) {
        String boCode = (String) ThreadMapUtil.get("boCode");
        IBusTableRel relation = (IBusTableRel) ThreadMapUtil.get("relation");

        if (relation.getType().equals(BusTableRelType.ONE_TO_MANY.getKey())) {
            element.attr("v-model", column.getTable().getKey() + "." + column.getKey());

            return;
        }
        element.attr("v-model", getScopePath(relation) + "." + column.getKey());


        String configStr = column.getCtrl().getConfig();
        if (StringUtil.isEmpty(configStr)) {
            return;
        }

        JSONObject config = JSON.parseObject(configStr);
        Boolean placeholder = config.getBoolean("placeholder");

        if (placeholder == null || !placeholder.booleanValue())
            return;
        element.attr("placeholder", config.getString("placeholderText"));
    }


    protected String getColumnOnetext(IBusinessColumn column) {
        Element element = getElement("input").attr("type", "text").addClass("weui-input");

        handleVModel(element, column);
        handlePermission(element, column);
        handleValidateRules(element, column);

        return element.toString();
    }


    protected String getColumnDate(IBusinessColumn column) {
        Element element = getElement("ab-date");

        handleVModel(element, column);
        handlePermission(element, column);
        handleValidateRules(element, column);
        element.attr(":ab-permission", getPermissionPath(column));

        JSONObject config = JSON.parseObject(column.getCtrl().getConfig());
        checkCtrConfig(column, config, "format");
//    String configStr = column.getCtrl().getConfig();
//    if (StringUtil.isEmpty(configStr)) {
//      throw new BusinessException(String.format("表【%s】日期字段  【%s】解析失败,配置信息不能为空", new Object[] { column.getTable().getKey(), column.getComment() }));
//    }

        String format = config.getString("format");

        element.attr("format", format.replace("yyyy", "YYYY").replace("dd", "DD").replace(":ss", ""));

        return element.toString();
    }

    protected String getColumnDic(IBusinessColumn column) {
        Element element = getElement("ab-dict").attr("type", "text").addClass("input-div");

        handleVModel(element, column);
        handlePermission(element, column);
        handleValidateRules(element, column);

        JSONObject config = JSON.parseObject(column.getCtrl().getConfig());
        checkCtrConfig(column, config, "key");
//    if (!config.containsKey("key")) {
//      throw new BusinessException(String.format("表【%s】数据字典  字段【%s】解析失败,alias 配置信息不能为空", new Object[] { column.getTable().getKey(), column.getComment() }));
//    }

        element.attr("dict-key", config.getString("key"));

        return element.toString();
    }

    protected String getColumnIdentity(IBusinessColumn column) {
        Element element = getElement("input").attr("type", "text").addClass("weui-input");
        handleVModel(element, column);
        handlePermission(element, column);
        handleValidateRules(element, column);

        JSONObject config = JSON.parseObject(column.getCtrl().getConfig());
        checkCtrConfig(column, config, "alias");
//    if (!config.containsKey("alias")) {
//      throw new BusinessException(String.format("表【%s】流水号  字段【%s】解析失败,alias 配置信息不能为空", new Object[] { column.getTable().getKey(), column.getComment() }));
//    }
        element.attr("ab-serial-no", config.getString("alias"));
        return element.toString();
    }

    protected String getColumnMultitext(IBusinessColumn column) {
        Element element = getElement("textarea").attr("type", "text").addClass("weui-textarea");

        handleVModel(element, column);
        handlePermission(element, column);
        handleValidateRules(element, column);

        return element.toString();
    }


    protected String getColumnCheckBox(IBusinessColumn column) {
        JSONObject config = JSON.parseObject(column.getCtrl().getConfig());
        if (!config.containsKey("options")) {
            throw new BusinessException(String.format("表【%s】CheckBox 字段  【%s】解析失败,options 配置信息不能为空", new Object[]{column.getTable().getKey(), column.getComment()}));
        }

        Element checkbox = getElement("ab-checkbox");
        handleVModel(checkbox, column);
        handlePermission(checkbox, column);
        Element template = checkbox.appendElement("div").attr("slot-scope", "scope");

        JSONArray options = config.getJSONArray("options");
        for (int i = 0; i < options.size(); i++) {
            JSONObject option = options.getJSONObject(i);

            Element element = template.appendElement("label").addClass("checkbox-inline");
            Element child = element.appendElement("input").attr("type", "checkbox");
            child.attr("v-model", "scope.tempData.currentValue");
            child.attr("value", option.getString("key"));
            child.attr("name", String.format("%s-%s-%s", new Object[]{ThreadMapUtil.get("boCode"), column.getTable().getKey(), column.getName()}));
            handlePermission(child, column);
            element.appendText(option.getString("txt"));
        }
        handleValidateRules(checkbox, column);

        return checkbox.toString();
    }

    protected String getColumnRadio(IBusinessColumn column) {
        JSONObject config = JSON.parseObject(column.getCtrl().getConfig());
        if (!config.containsKey("options")) {
            throw new BusinessException(String.format("表【%s】Radio 字段  【%s】解析失败,options 配置信息不能为空", new Object[]{column.getTable().getKey(), column.getComment()}));
        }

        Element permissionElement = getElement("div");
        JSONArray options = config.getJSONArray("options");
        for (int i = 0; i < options.size(); i++) {
            JSONObject option = options.getJSONObject(i);

            Element label = permissionElement.appendElement("label").addClass("radio-inline");
            Element child = label.appendElement("input").attr("type", "radio");

            handleVModel(child, column);
            child.attr("v-ab-permission", getPermissionPath(column));
            handleValidateRules(child, column);

            child.attr("value", option.getString("key"));
            label.appendText(option.getString("txt"));
        }

        return permissionElement.toString();
    }


    protected String getColumnSelect(IBusinessColumn column, Boolean isMultiple) {
        JSONObject config = JSON.parseObject(column.getCtrl().getConfig());
        if (!config.containsKey("options")) {
            throw new BusinessException(String.format("表【%s】Select 字段  【%s】解析失败,options 配置信息不能为空", new Object[]{column.getTable().getKey(), column.getComment()}));
        }

        Element permissionElement = getElement("select").addClass("weui-input");
        handleVModel(permissionElement, column);
        permissionElement.attr("v-ab-permission", getPermissionPath(column));
        handleValidateRules(permissionElement, column);

        if (isMultiple.booleanValue()) {
            permissionElement.attr("multiple", "true");
        }

        Element select = permissionElement.appendElement("option");
        select.attr("value", "");
        select.text("请选择");

        JSONArray options = config.getJSONArray("options");
        for (int i = 0; i < options.size(); i++) {
            JSONObject option = options.getJSONObject(i);

            Element element = permissionElement.appendElement("option");
            element.attr("value", option.getString("key"));
            element.text(option.getString("txt"));
        }

        return permissionElement.toString();
    }


    protected String getColumnFile(IBusinessColumn column) {
        IBusTableRel relation = (IBusTableRel) ThreadMapUtil.get("relation");

        Element element = getElement("ab-upload").attr("v-bind:permission", getPermissionPath(column));
        element.attr("desc", relation.getTableComment() + "-" + column.getComment());
        handleVModel(element, column);
        element.append("<a href=\"javascript:;\" class=\"weui-btn weui-btn_mini weui-btn_primary fa fa-upload\">" + column.getComment() + "</a>");
        return element.toString();
    }


    public String getSubAttrs(IBusTableRel rel) {
        StringBuilder sb = new StringBuilder();
        sb.append(" id=\"" + rel.getBusObj().getKey() + "-" + rel.getTableKey() + "\" ");


        if (rel.getType().equals(BusTableRelType.ONE_TO_MANY.getKey()) &&
                !rel.getParent().getType().equals(BusTableRelType.MAIN.getKey())) {

            sb.append(" v-transfer-dom ");
            sb.append(" v-if=\"subTempData." + rel.getTableKey() + "List\" ");
        }

        sb.append(" table-key=\"" + rel.getTableKey() + "\" ");
        return sb.toString();
    }


    @Override
    protected void handlePermission(Element element, IBusinessColumn column) {
        element.attr("v-ab-permission", getPermissionPath(column));
    }


    protected void handleValidateRules(Element element, IBusinessColumn column) {
        super.handleValidateRules(element, column);

        element.attr("v-ab-validate", element.attr("ab-validate"));
        element.removeAttr("ab-validate");
    }


    public String getGeneratorName() {
        return "mobileGenerator";
    }
}
